package ventanas;

import gestores.SistemaEmpresas;
import gestores.SistemaEstadisticas;

import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.Font;
import java.awt.GridBagConstraints;
import java.awt.Insets;
import java.awt.Rectangle;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Timestamp;
import java.text.DecimalFormat;
import java.util.ArrayList;

import clasesBasicas.Global;

import javax.swing.Icon;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFormattedTextField;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.border.BevelBorder;
import javax.swing.plaf.IconUIResource;

import org.jfree.chart.ChartPanel;

import utilidades.InformacionActualizacion;
import utilidades.actualizador;
import clasesBasicas.Empresa;
import clasesBasicas.Global;
import clasesBasicas.Usuario;
import net.miginfocom.swing.MigLayout;

import java.awt.event.FocusEvent;
import java.awt.event.FocusListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;
import javax.swing.JTextPane;
import javax.swing.JScrollPane;

public class PanelEmpresa extends JPanel {

	Empresa empresaActual=null;
	JLabel lblVarNomEmp = new JLabel("NombreEmpresa");//Cambia con Empresa o actualizacion
	JPanel panelVarGrafEmp = new JPanel();//Cambia con Empresa o actualizacion
	JPanel panelGrafico;
	JLabel lblFijoDatosActuales = new JLabel("Datos Actuales");
	JLabel lblFijoValorActual = new JLabel("Valor Actual:");
	JLabel lblFijoCompra = new JLabel("Compra");
	JLabel lblFijoCantidadCompra = new JLabel("Cantidad:");
	JFormattedTextField formattedTextFieldCompra = new JFormattedTextField();
	JFormattedTextField formattedTextFieldVenta = new JFormattedTextField();
	JLabel lblFijoEurosCompra = new JLabel("Euros:");
	JLabel lblVarEurosCompra = new JLabel("0.0");//Cambia con Empresa o actualizacion
	JButton btnComprar = new JButton("Comprar");
	JLabel lblVenta = new JLabel("Venta");
	JLabel lblFijoCantidadVenta = new JLabel("Cantidad:");
	JLabel lblFijoEurosVenta = new JLabel("Euros:");
	JLabel lblVarEurosVenta = new JLabel("0.0");//Cambia con Empresa o actualizacion
	JButton btnFijoVender = new JButton("Vender");
	JLabel lblVarValorActual = new JLabel("0.0");//Cambia con Empresa o actualizacion
	JLabel lblFijoDiferencia = new JLabel("Diferencia:");
	JLabel lblVarDiferencia = new JLabel("0.0");//Cambia con Empresa o actualizacion
	JLabel lblFijoPorcentaje = new JLabel("%");
	JLabel lblMximo = new JLabel("Máximo:");
	JLabel lblVarMaximo = new JLabel("0.0");//Cambia con Empresa o actualizacion
	JLabel lblFijoMnimo = new JLabel("Mínimo:");
	JLabel lblVarMinimo = new JLabel("0.0");//Cambia con Empresa o actualizacion
	JLabel lblMaxCompra = new JLabel("");
	JLabel lblMaxVenta = new JLabel("");
	
	JTextPane textPane = new JTextPane();
	Estadistica estPanel =new Estadistica ();
	public ChartPanel grafico=null;
	private boolean fav = false;
	private ImageIcon estrella;
	private ImageIcon estrellaRellena;
	
	private DecimalFormat decf = new DecimalFormat("###.#####");


	public PanelEmpresa() {
//		try {
//			clasesBasicas.Global.sisEmp= new SistemaEmpresas();
//		} catch (Exception e1) {
//			// TODO Auto-generated catch block
//			e1.printStackTrace();
//		}
		setLayout(null);
		lblVarNomEmp.setBounds(7, 7, 209, 25);

		lblVarNomEmp.setFont(new Font("Tahoma", Font.PLAIN, 20));
		add(lblVarNomEmp);
		lblFijoDatosActuales.setBounds(17, 361, 116, 22);
		lblFijoDatosActuales.setFont(new Font("Tahoma", Font.PLAIN, 18));
		add(lblFijoDatosActuales);
		lblFijoValorActual.setBounds(17, 389, 74, 16);
		add(lblFijoValorActual);
		lblFijoCompra.setBounds(17, 410, 74, 20);
		lblFijoCompra.setFont(new Font("Tahoma", Font.PLAIN, 18));
		add(lblFijoCompra);
		lblFijoCantidadCompra.setBounds(17, 438, 55, 16);
		add(lblFijoCantidadCompra);
		formattedTextFieldCompra.setBounds(76, 435, 94, 22);
		formattedTextFieldCompra.setColumns(8);
		add(formattedTextFieldCompra);
		lblFijoEurosCompra.setBounds(293, 438, 37, 16);
		add(lblFijoEurosCompra);
		lblVarEurosCompra.setBounds(342, 438, 98, 16);
		lblVarEurosCompra.setPreferredSize(new Dimension(50, 16));
		add(lblVarEurosCompra);
		btnComprar.setBounds(452, 434, 83, 25);
		add(btnComprar);
		btnComprar.setEnabled(false);
		lblVenta.setBounds(17, 463, 56, 20);
		lblVenta.setFont(new Font("Tahoma", Font.PLAIN, 18));
		add(lblVenta);
		lblFijoCantidadVenta.setBounds(17, 491, 55, 16);
		add(lblFijoCantidadVenta);
		formattedTextFieldVenta.setBounds(76, 488, 94, 22);
		formattedTextFieldVenta.setColumns(8);
		add(formattedTextFieldVenta);
		lblFijoEurosVenta.setBounds(296, 491, 56, 16);
		add(lblFijoEurosVenta);
		lblVarEurosVenta.setBounds(342, 491, 98, 16);
		lblVarEurosVenta.setPreferredSize(new Dimension(50, 16));
		add(lblVarEurosVenta);
		btnFijoVender.setBounds(452, 487, 83, 25);
		btnFijoVender.setPreferredSize(new Dimension(83, 25));
		btnFijoVender.setEnabled(false);
		add(btnFijoVender);
		lblVarValorActual.setBounds(95, 387, 75, 19);
		lblVarValorActual.setFont(new Font("Tahoma", Font.BOLD, 15));
		add(lblVarValorActual);
		lblFijoDiferencia.setBounds(176, 389, 62, 16);
		add(lblFijoDiferencia);
		lblVarDiferencia.setBounds(239, 389, 37, 16);
		add(lblVarDiferencia);
		lblFijoPorcentaje.setBounds(279, 389, 12, 16);
		add(lblFijoPorcentaje);
		lblMximo.setBounds(303, 389, 49, 16);
		add(lblMximo);
		lblVarMaximo.setBounds(355, 389, 37, 16);
		add(lblVarMaximo);
		lblFijoMnimo.setBounds(415, 389, 46, 16);
		add(lblFijoMnimo);
		lblVarMinimo.setBounds(465, 389, 37, 16);
		add(lblVarMinimo);
//		panelGrafico= new JPanel();
//		add(panelGrafico, "cell 0 1,growx");

		
		
	//FUNCIONA? no, yo no la veo //Existe un metodo del boton que pone otro icono al pulsar
		//No hace falta ir cambiandolo

		

		Global.btnFavorito = new JButton("");
		Global.btnFavorito.setPreferredSize(new Dimension(50, 50));
		Global.btnFavorito.setMinimumSize(new Dimension(50, 50));
		Global.btnFavorito.setMaximumSize(new Dimension(50, 50));
		Global.btnFavorito.setBounds(new Rectangle(228, 7, 39, 37));
		GridBagConstraints gbc_button = new GridBagConstraints();
		gbc_button.insets = new Insets(0, 0, 5, 0);
		gbc_button.gridx = 0;
		gbc_button.gridy = 26;
		add(Global.btnFavorito, gbc_button);
	
		Global.btnFavorito.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent arg0) {
				if(!fav){
					fav = true;
					Global.btnFavorito.setIcon(new ImageIcon("imagenesBasicas/estrellaRellena.png"));
					Global.sU.añadirFavorito(Global.sU.usuarioActual.getDni(), empresaActual.getCodigo());
					
				}else{
					fav = false;
					Global.btnFavorito.setIcon(new ImageIcon("imagenesBasicas/estrella.jpg"));

					Global.sU.eliminarFavorito(Global.sU.usuarioActual.getDni(), empresaActual.getCodigo());
				}
				
				
			}
		});

		
		
		
		
		JLabel lblDispMaxCompra = new JLabel("Disponibles:");
		lblDispMaxCompra.setBounds(94, 413, 86, 16);
		add(lblDispMaxCompra);
		
		JLabel lblDispMaxVenta = new JLabel("Disponibles:");
		lblDispMaxVenta.setBounds(95, 467, 86, 16);
		add(lblDispMaxVenta);
		
		lblMaxVenta.setBounds(171, 467, 141, 16);
		add(lblMaxVenta);
		
		lblMaxCompra.setBounds(171, 414, 141, 16);
		add(lblMaxCompra);
		
		
		
		
		textPane.setBounds(1, 1, 336, 126);
		add(textPane);
		
		JLabel lblDescripcin = new JLabel("Descripción:");
		lblDescripcin.setFont(new Font("Microsoft YaHei", Font.BOLD | Font.ITALIC, 14));
		lblDescripcin.setBounds(462, 37, 94, 25);
		add(lblDescripcin);
		
		
		JScrollPane scrollPane = new JScrollPane(textPane);
		scrollPane.setBounds(462, 75, 358, 197);
		add(scrollPane);
		
		estPanel.setBounds(17, 47, 435, 287);
		add(estPanel);
		
		//ESTADISTICAS?¿¿?¿
//		ChartPanel panelEstadistica = new ChartPanel(null);
//		panelEstadistica = Global.sisEst.generarGrafico(1);
//		add(panelEstadistica, "cell 0 1,growx");
		
		Global.btnFavorito.setVisible(false);


		//		add(lblVarfecha, "cell 0 2");
		actualizarPEmpresa();

		//???????????????????????????????????????????????
		//???????????????????????????????????????????????
		//???????????????????????????????????????????????
		//???????????????????????????????????????????????
		//???????????????????????????????????????????????
		//???????????????????????????????????????????????
		//NO TIENE QUE SER MODIFICABLE? Claro, pero esto era de prueba, si no hay ninguna forma para determinarlo.


		//escuchadores
		//Segun el valor que se meta, al perder el foco, se mostrará el precio.//crear un hilo***************


		formattedTextFieldCompra.addKeyListener(new KeyAdapter() {
			@Override
			public void keyReleased(KeyEvent e) {

				String tcompra=formattedTextFieldCompra.getText();
				if (((e.getKeyChar()<48)&&(e.getKeyChar()!=8))||(e.getKeyChar()>57))
				{
					String temp=formattedTextFieldCompra.getText();
					if(temp.length()>0)
					{
						temp=temp.substring(0, temp.length()-1);
					}
					formattedTextFieldCompra.setText(temp);
				}

				if(tcompra.compareTo("0")<=0)//Para que aparezca 0 cuando esta vacio¿
				{
					double precio= 0;
					try{
						double cant =0;

						lblVarEurosCompra.setText(decf.format(cant)+"");
					}catch(NumberFormatException ex)
					{
					}
				}
				else
				{
					try{
						int cant =Integer.parseInt(tcompra);
						double valorActual=Double.parseDouble(lblVarValorActual.getText());
						double precio= cant*valorActual;
						lblVarEurosCompra.setText(decf.format(precio)+"");
					}catch(NumberFormatException ex)
					{
					}				
				}
			}
		});

		//permite la compra de acciones
		btnComprar.addMouseListener(new MouseAdapter() {
			
			public void mousePressed(MouseEvent arg0) {

				String tcompra=formattedTextFieldCompra.getText();
				if(tcompra==null)
				{
					JOptionPane.showMessageDialog(null, "El valor introducido es insuficiente. Introduzca otro valor.", "Valor incorrecto", JOptionPane.ERROR_MESSAGE);
				}
				else
				{
					if(Global.sU.usuarioActual!=null)
					{
						try{
							formattedTextFieldCompra.setText("");
							lblVarEurosCompra.setText("0.0");
							int cant =Integer.parseInt(tcompra);
							double valorActual=Double.parseDouble(lblVarValorActual.getText());
							double precio=valorActual*cant;
							Usuario actual=Global.sU.usuarioActual;
							if(precio<actual.getDineroActual())
							{
								int eleccion=JOptionPane.showConfirmDialog(null, "¿Esta usted seguro que quiere comprar "+cant+" acciones de "+lblVarNomEmp.getText()+"?", "Confirmación de compra", JOptionPane.YES_NO_OPTION, JOptionPane.WARNING_MESSAGE);
								System.out.println(eleccion);
								if(eleccion==0)
								{

									Global.sisEmp.comprarAcciones(actual.getDni(), empresaActual.getCodigo(), cant, valorActual);
									
									Global.pNorte.lblInfoCuenta.setText("Dinero: " + decf.format(Global.sU.usuarioActual.getDineroActual())+"     Nivel de Juego: "+Global.sU.usuarioActual.getNivelActual());
								}
								else
								{
									JOptionPane.showMessageDialog(null, "Operación de compra abortada", "Compra cancelada", JOptionPane.INFORMATION_MESSAGE);
								}
							}
							else
							{
								JOptionPane.showMessageDialog(null, "No puede realizar la compra, el saldo es insuficiente.", "Saldo insuficiente", JOptionPane.ERROR_MESSAGE);
							}
						}catch(NumberFormatException e)
						{
							JOptionPane.showMessageDialog(null, "El valor introducido no es correcto. Comprueba que sea un número.", "Valor incorrecto", JOptionPane.ERROR_MESSAGE);
						}
					}
				}
				formattedTextFieldCompra.setText("");
			}
		});



		formattedTextFieldVenta.addKeyListener(new KeyAdapter() {
			public void keyReleased(KeyEvent e) {

				String tventa=formattedTextFieldVenta.getText();
				if (((e.getKeyChar()<48)&&(e.getKeyChar()!=8))||(e.getKeyChar()>57))
				{
					String temp=formattedTextFieldVenta.getText();
					if(temp.length()>0)
					{
						temp=temp.substring(0, temp.length()-1);
					}
					formattedTextFieldVenta.setText(temp);
				}
				
				if(tventa.compareTo("0")<=0)//Para que aparezca 0 cuando esta vacio¿
				{
					double precio= 0;
					try{
						double cant =0;
						
						lblVarEurosVenta.setText(decf.format(cant)+"");
					}catch(NumberFormatException ex)
					{
					}
				}
				else
				{
					try{
						int cant =Integer.parseInt(tventa);
						double valorActual=Double.parseDouble(lblVarValorActual.getText());
						double precio= cant*valorActual;
						lblVarEurosVenta.setText(decf.format(precio)+"");
					}catch(NumberFormatException ex)
					{
					}				
				}
			}
		});

		btnFijoVender.addMouseListener(new MouseAdapter() {
			public void mousePressed(MouseEvent arg0) {

				String tventa=formattedTextFieldVenta.getText();
				if(tventa==null)
				{
					JOptionPane.showMessageDialog(null, "El valor introducido es insuficiente. Introduzca otro valor.", "Valor incorrecto", JOptionPane.ERROR_MESSAGE);
				}
				else
				{
					if(Global.sU.usuarioActual!=null)
					{
						try{
							
							int cant =Integer.parseInt(tventa);
							double valorActual=Double.parseDouble(lblVarValorActual.getText());
							double precio=valorActual*cant;
							Usuario actual=Global.sU.usuarioActual;
							double puntos = Global.sU.usuarioActual.getDineroActual();
							//revisar de aqui hacia abajo
							int vender=Integer.parseInt(formattedTextFieldVenta.getText());
							
							if(vender<=actual.getAcciones(Global.cod_Emp_Sel))
							{
								int eleccion=JOptionPane.showConfirmDialog(null, "¿Esta usted seguro que quiere vender "+vender+" acciones de "+lblVarNomEmp.getText()+"?", "Confirmación de venta", JOptionPane.YES_NO_OPTION, JOptionPane.WARNING_MESSAGE);
								
								if(eleccion==0)
								{

									Global.sisEmp.venderAcciones(actual.getDni(), empresaActual.getCodigo(), cant, valorActual);
									Global.sU.actualizarPuntos(puntos,actual);
									Global.pNorte.lblInfoCuenta.setText("Dinero: " + decf.format(Global.sU.usuarioActual.getDineroActual())+"     Nivel de Juego: "+Global.sU.usuarioActual.getNivelActual());
									
								}
								else
								{
									JOptionPane.showMessageDialog(null, "Operación de compra abortada", "Compra cancelada", JOptionPane.INFORMATION_MESSAGE);
								}
							}
							else
							{
								JOptionPane.showMessageDialog(null, "No se puede vender, no se tiene las acciones seleccionadas.", "Saldo insuficiente", JOptionPane.ERROR_MESSAGE);
							}
							formattedTextFieldVenta.setText("");
							lblVarEurosVenta.setText("0.0");
						}catch(NumberFormatException e)
						{
							JOptionPane.showMessageDialog(null, "El valor introducido no es correcto. Comprueba que sea un número.", "Valor incorrecto", JOptionPane.ERROR_MESSAGE);
						}
					}
				}
			}
		});

	}

	public void actualizarPEmpresa()
	{
		//panelGrafico.removeAll();
		
//		clasesBasicas.Global.sisEmp.datosEstadisticas("01/05/14 00:00:00", "07/05/14 23:59:00",clasesBasicas.Global.cod_Emp_Sel);
//		clasesBasicas.Global.sisEst= new SistemaEstadisticas();
		//grafico=clasesBasicas.Global.sisEst.generarGrafico(0);
		//add(grafico, "cell 0 1,growx");
//		panelGrafico.repaint();

		Empresa temp= clasesBasicas.Global.sisEmp.getEmpresa(clasesBasicas.Global.cod_Emp_Sel);
		empresaActual=temp;
		String svalor= String.valueOf(empresaActual.getUltimo());
		String nomEmp=empresaActual.getNombre();//sacar de la base de datos
		String diferencia=String.valueOf(empresaActual.getDiferencia());
		String maximo=String.valueOf(empresaActual.getMaximo());
		String minimo=String.valueOf(empresaActual.getMinimo());
		//		String consulta2="SELECT * FROM VALOR_ACTUAL WHERE COD_EMPRESA="+cod_empresa;
		lblVarNomEmp.setText(nomEmp);
		lblVarDiferencia.setText(diferencia);
		lblVarMaximo.setText(maximo);
		lblVarMinimo.setText(minimo);
		lblVarValorActual.setText(svalor);
		textPane.setText(empresaActual.getDescripcion());
		
		//		lblVarfecha.setText("("+shora+")");

		//metodo cambiar

		if(Global.sU.usuarioActual!=null)
		{
			fav=Global.sU.usuarioActual.getFavorito(Global.cod_Emp_Sel);
		if(fav){
			fav = true;
			Global.btnFavorito.setIcon(new ImageIcon("imagenesBasicas/estrellaRellena.png"));
		}else{
			fav = false;
			Global.btnFavorito.setIcon(new ImageIcon("imagenesBasicas/estrella.jpg"));
			}
		}
		else
		{
			Global.btnFavorito.setVisible(false);
		}
		
		estPanel.setEstadistica(Global.cod_Emp_Sel);
		this.repaint();
	}
	
	public void actualizarMaximos()
	{
		double dinero=Global.sU.usuarioActual.getDineroActual();
		double ultim=Global.sisEmp.getEmpresa(Global.cod_Emp_Sel).getUltimo();
		int maxCompra=(int)(dinero/ultim);
		Global.sisEmp.actualizarAccionesEmpresa(Global.sU.usuarioActual.getDni(), Global.cod_Emp_Sel);
		lblMaxCompra.setText(Integer.toString(maxCompra));
		lblMaxVenta.setText(Integer.toString(Global.sU.usuarioActual.getAcciones(Global.cod_Emp_Sel)));
		
	}


	public void removerGrafico()
	{
		if(grafico!=null)
		{
			remove(grafico);
			grafico=null;
			updateUI();
		}
	}
}


